\documentclass{article}

% Language setting
% Replace `english' with e.g. `spanish' to change the document language
\usepackage[english]{babel}

% Set page size and margins
% Replace `letterpaper' with `a4paper' for UK/EU standard size
\usepackage[letterpaper,top=2cm,bottom=2cm,left=3cm,right=3cm,marginparwidth=1.75cm]{geometry}
\usepackage{xeCJK}
% Useful packages
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage[colorlinks=true, allcolors=blue]{hyperref}

\title{二叉树和节点逻辑设计}
\author{舒开宸}

\begin{document}
\maketitle
\section{类关系}
\subsection{节点类}
BinaryNode作为二叉树节点的一个基类，包括BinaryNode *left, BinaryNode* left, Comparapble element。 BinarySearchTree可以调用这个类。但是对于AvlTree而言，AvlTree的节点需要增加height变量，所以二叉树的节点AvlNode就是一个特殊的BinaryNode，故将其设置为BinaryNode的子类。
\subsection{树类}
包括BinaryTree和BinarySearchTree和AvlNodetree。BinaryTree是没有特殊功能的最基本二叉树结构，包括一个根节点BinaryNode * root,BinaryTree作为基类不为其设置实际功能，所以insert、remove等基本功能作为纯虚函数存在。我为这个类设置了基本的构造和析构函数，仅保证对象能建立并被回收内存。BinarySearchTree具有搜索功能的二叉树，所以设置为BinaryTree的基类。其中的insert、remove、遍历等功能需要具体实现。AvlNodeTree则是一种更为高效的二叉搜索树，所以将其设置为BinaryTree和BinarySearchTree共同的子类，就实现了从BinaryTree到BinarySearchTree到AvlNodeTree的自上而下的继承关系。AvlNodeTree中的insert和remove函数由于增加了balance和rotate过程，所以在AvlNodeTree中进行了重新定义。但是对于findMin,findMax,和中序遍历函数InfixOutput而言，对于特殊的二叉搜索树可用且没有参数要求(可以直接用this指针进行节点的定位，不过还是得看函数具体实现)，所以在AVLNodeTree中不进行重新定义而直接调用父类的函数。
\subsection{个人理解}
继承虽然可以实现不同类之间具有同功能函数、变量访问的能力，但是会受到变量类型、函数参数类型的影响而导致不兼容，所以很多情况下需要重新定义同功能变量和函数。继承关系主要作用应该在于加强逻辑关系。
\section{构架示意图}

说明：在子类重新定义的函数和成员变量由于功能相同，就不重复展示了，示意图说明子类继承了父类的全部特征并且具有更为的功能
\begin{figure}
    \vspace{-14cm}
    \centering
    \includegraphics[width=8cm,height=5cm]{1.png}
    \caption{节点关系}
    \label{fig:my_label}
\end{figure}

\begin{figure}
    \vspace{-14cm}
    \centering
    \includegraphics[width=11cm,height=7cm]{1.png}
    \caption{Caption}
    \label{fig:my_label}
\end{figure}
\end{document}